package com.shijie.sjoj.model.utils;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.shijie.sjoj.model.base.BaseException;

import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * Json格式化工具类
 *
 * @author ZSJ
 */
public class JsonFileUtils {

    /**
     * ObjectMapper唯一实例
     */
    private static final ObjectMapper JsonMapper = new ObjectMapper();

    /**
     * 获取唯一Json操作的ObjectMapper实例
     */
    public static ObjectMapper jsonInstance() {
        return JsonMapper;
    }

    /**
     * 将对象转为Json数据
     */
    public static <T> String toJson(T obj) {
        try {
            return JsonMapper.writeValueAsString(obj);
        } catch (Exception e) {
            throw BaseException.throwError(e.toString());
        }
    }

    /**
     * 将Json字符串转为普通java对象
     */
    public static <T> T fromJson1(String json, Class<T> type) {
        try {
            return JsonMapper.readValue(json, type);
        } catch (JsonProcessingException e) {
            throw BaseException.throwError(e.toString());
        }
    }

    /**
     * 将Json字符串转为复杂java对象，比如集合，泛型等
     */
    public static <T> T fromJson2(String json, T type) {
        try {
            TypeReference<T> typeReference = new TypeReference<T>() {
            };
            return JsonMapper.readValue(json, typeReference);
        } catch (JsonProcessingException e) {
            throw BaseException.throwError(e.toString());
        }
    }

    /**
     * 写数据到指定路径
     */
    public static <T> Path writeJson2FilePath(String dirs, String filename, T content) {
        // 设置目录路径
        Path dirspath = Paths.get(dirs);
        // 设置文件保存路径
        Path filepath = Paths.get(dirs, filename + ".txt");
        try {
            // 判断目录路径是否存在并创建
            if (!Files.exists(dirspath)) {
                Files.createDirectories(dirspath);
            }
            // 判断文件路径是否存在并创建
            if (!Files.exists(filepath)) {
                Files.createFile(filepath);
            }
            // 将数据格式化为Json
            String json = toJson(content);
            // 将数据（覆盖）写入文件
            Files.writeString(filepath, json, StandardCharsets.UTF_8);
        } catch (Exception e) {
            throw BaseException.throwError(e.toString());
        }
        // 返回文件路径
        return filepath;
    }

    /**
     * 从到指定路径读简单格式数据
     * 对于[]（数组/集合）一般会读取为集合（ArrayList）
     */
    public static <T> T readJson4FilePath1(Path filepath, Class<T> type) {
        // 判断文件路径是否存在
        if (!Files.exists(filepath)) {
            throw BaseException.throwError("路径不存在" + filepath);
        }
        try {
            // 从文件读取Json格式数据
            String json = Files.readString(filepath, StandardCharsets.UTF_8);
            // 返回数据
            return fromJson1(json, type);
        } catch (Exception e) {
            throw BaseException.throwError(e.toString());
        }
    }

    /**
     * 从到指定路径读复杂格式数据，比如集合
     */
    public static <T> T readJson4FilePath2(Path filepath, T type) {
        // 判断文件路径是否存在
        if (!Files.exists(filepath)) {
            throw BaseException.throwError("路径不存在" + filepath);
        }
        try {
            // 从文件读取Json格式数据
            String json = Files.readString(filepath, StandardCharsets.UTF_8);
            // 返回数据
            return fromJson2(json, type);
        } catch (Exception e) {
            throw BaseException.throwError(e.toString());
        }
    }


}
